package com.lqk.decorator;

/**
 * @author lqk
 * @date 2021/12/5 18:22
 *
 * 装饰者模式定义
 *  1) 装饰者模式：动态的将新功能附加到对象上。在对象功能扩展方面，它比继承更
 *  有弹性，装饰者模式也体现了开闭原则(ocp)
 *  2) 这里提到的动态的将新功能附加到对象和ocp原则，在后面的应用实例上会以代
 *  码的形式体现，请同学们注意体会。
 */
public class CoffeeBar {
    public static void main(String[] args) {
        // 装饰者模式下的订单：2份巧克力+一份牛奶的LongBlack
        // 1. 点一份LongBlack
        Drink order = new LongBlack();
        System.out.println("描述1= " + order.getDes());
        System.out.println("费用1= " + order.cost());
        // 2. 加入一份牛奶
        order = new Milk(order);
        System.out.println("order 加入一份牛奶 描述= " + order.getDes());
        System.out.println("order 加入一份牛奶 费用= " + order.cost());
        // 3. 加入一份巧克力
        order = new Chocolate(order);
        System.out.println("order 加入一份牛奶、一份巧克力 描述= " + order.getDes());
        System.out.println("order 加入一份牛奶、一份巧克力 费用= " + order.cost());

        // 4. 加入一份巧克力
        order = new Chocolate(order);
        System.out.println("order 加入一份牛奶、一份巧克力*2 描述= " + order.getDes());
        System.out.println("order 加入一份牛奶、一份巧克力*2 费用= " + order.cost());
    }
}
